// 文件上传

// 使用 CommonJS 模块导入
const express = require('express');
const multer = require('multer');
const fs = require('fs');
const path = require('path');

// 导入数据库操作模块
const db = require('./database');

// 使用内存存储代替磁盘存储，以便将文件数据直接保存到数据库
const storage = multer.memoryStorage();
const upload = multer({ storage: storage });

// 上传文件并保存到数据库
async function uploadFile(req, res) {
    upload.single('file')(req, res, async function (err) {
        if (err instanceof multer.MulterError) {
            return res.status(500).json({ error: err.message });
        } else if (err) {
            return res.status(500).json({ error: err.message });
        }

        try {
            // 检查是否有文件上传
            if (!req.file) {
                return res.status(400).json({ error: '没有文件被上传' });
            }

            const file = req.file;
            const sessionId = req.body.sessionId || null; // 可选的会话ID

            // 保存文件到数据库
            const result = await db.saveFile(
                file.originalname,
                file.mimetype,
                file.size,
                file.buffer,
                sessionId
            );

            if (result.success) {
                res.status(200).json({
                    message: '文件上传成功并保存到数据库',
                    fileId: result.data.fileId,
                    filename: file.originalname
                });
            } else {
                res.status(500).json({
                    error: result.message,
                    details: result.error
                });
            }
        } catch (error) {
            res.status(500).json({
                error: '文件处理过程中发生错误',
                details: error instanceof Error ? error.message : String(error)
            });
        }
    });
}

// 下载文件
async function downloadFile(req, res) {
    try {
        const { fileId } = req.params;

        // 从数据库获取文件
        const result = await db.getFile(fileId);

        if (result.success) {
            const fileData = result.data;
            
            // 设置响应头
            res.setHeader('Content-Type', fileData.contentType);
            res.setHeader('Content-Disposition', `attachment; filename="${fileData.filename}"`);
            res.setHeader('Content-Length', fileData.fileSize);
            
            // 发送文件数据
            res.send(fileData.fileData);
        } else {
            res.status(404).json({
                error: result.message
            });
        }
    } catch (error) {
        res.status(500).json({
            error: '文件下载过程中发生错误',
            details: error instanceof Error ? error.message : String(error)
        });
    }
}

module.exports = {
    uploadFile,
    downloadFile
};